package lambdademo;

import java.util.Comparator;
import java.util.PriorityQueue;

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    //注意：有且只能有一个抽象方法
    void test();
   /* default void test2(){

    }
    public static void fun(){

    }*/
}
//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}
//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}
//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

public class Test {
    public static void main(String[] args) {
        //NoParameterReturn noParameterReturn = ()->{return 10;};
        NoParameterReturn noParameterReturn = ()->10;
        int ret = noParameterReturn.test();
        System.out.println(ret);
        OneParameterReturn oneParameterReturn = a -> a;
        ret = oneParameterReturn.test(7);
        System.out.println(ret);
        MoreParameterReturn moreParameterReturn=(a,b)->a+b;
        ret = moreParameterReturn.test(7,3);
        System.out.println(ret);


    }
    public static void main3(String[] args) {
       /* NoParameterNoReturn noParameterNoReturn1 = new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("fsafafa");
            }
        };
        noParameterNoReturn.test();
        */
        int c=10;

        NoParameterNoReturn noParameterNoReturn2 = ()->{
           // c=99;会报错
            System.out.println("fsafafa"+c);};//也存在变量捕获
        //NoParameterNoReturn noParameterNoReturn2 = ()->System.out.println("fsafafa");
        noParameterNoReturn2.test();

       // OneParameterNoReturn oneParameterNoReturn = (a)->{System.out.println(a);};
       // OneParameterNoReturn oneParameterNoReturn = System.out::println;//方法的引用
        //如果有一个参数的时候，那么小括号可以省略，如果方法体只有一行代码，那么花括号可以省略
        OneParameterNoReturn oneParameterNoReturn = a->System.out.println(a);
        oneParameterNoReturn.test(10);

       // MoreParameterNoReturn moreParameterNoReturn = (int a,int b)->{System.out.println(a+b);};
        //参数类型如果都要省略，请同时省略
        MoreParameterNoReturn moreParameterNoReturn = (a,b)->System.out.println(a+b);
        moreParameterNoReturn.test(1,2);
    }
    public static void main1(String[] args) {
        final int a=10;
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(a);//匿名内部类捕获常量只能是常量或者没有改变过的变量
                return o1-o2;
            }
        });
        //PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>(((o1, o2) -> {return o1-o2;}));也可以，不写return也可以
        PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>(((o1, o2) -> o1-o2));

    }
}
